from django.db import models

from libs.CommonBaseModel import BaseModel


# Create your models here.

# 文章表
class Article(BaseModel):
    title = models.CharField(verbose_name="文章标题", max_length=64)
    desc = models.CharField(verbose_name="文章简介", max_length=255)
    content = models.TextField(verbose_name="文章内容")
    # create_time
    # update_time

    # 数据库字段设计优化
    up_num = models.BigIntegerField(verbose_name="点赞数", default=0)
    down_num = models.BigIntegerField(verbose_name="点踩数", default=0)
    comment_num = models.BigIntegerField(verbose_name="评论数", default=0)

    # 文章关联个人站点
    # 一对多关系：一篇文章只能对应一个个人站点，但是一个个人站点可以有多篇文章
    blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)
    # 文章关联文章分类
    # 多对一关系：一篇文章可以对应一个分类，但是一个分类下可以有多篇文章
    category = models.ForeignKey(verbose_name="关联分类", to="CategoryClass", on_delete=models.CASCADE, null=True)
    # 文章关联文章标签
    # 多对多关系：一篇文章可以对应多个标签，一个标签下可以有多篇文章
    tags = models.ManyToManyField(verbose_name="关联文章和标签", to="CategoryTag",
                                  through='ArticleToTag', through_fields=("article", "tag"))

    # 定义数据库元信息
    class Meta:
        #  数据库表名
        db_table = "article"
        #  admin后台显示的表名称
        verbose_name = "文章表"
        verbose_name_plural = verbose_name

    # 默认以当前文章名称返回
    def __str__(self):
        return self.title


# 文章分类表
class CategoryClass(models.Model):
    name = models.CharField(verbose_name="文章分类", max_length=32)

    #  文章分类关联个人站点
    #  一对多关系：一个文章分类只能对应一个个人站点，但是一个个人站点可以有多个文章分类
    blog = models.ForeignKey(verbose_name="关联博客", to="blog.Blog", on_delete=models.CASCADE, null=True)

    # 配置数据库元信息
    class Meta:
        #  数据库表名
        db_table = "category_class"
        #  后台管理显示的名称
        verbose_name = "文章分类表"
        verbose_name_plural = verbose_name

    # 默认以当前文章名返回
    def __str__(self):
        return self.name


# 文章标签表
class CategoryTag(models.Model):
    name = models.CharField(verbose_name="文章标签", max_length=32)
    blog = models.ForeignKey(to="blog.Blog", on_delete=models.CASCADE, verbose_name="文章分类关联个人站点")

    # 配置数据库元信息
    class Meta:
        #   数据库表名
        db_table = "category_tag"
        #   后台管理显示的名称
        verbose_name = "文章标签表"
        verbose_name_plural = verbose_name

    # 默认以当前文章标签名返回
    def __str__(self):
        return self.name


# 创建关联表，用于存储文章和标签的关联关系(多对多关系)
class ArticleToTag(models.Model):
    article = models.ForeignKey(verbose_name="关联文章", to="Article", on_delete=models.CASCADE, null=True)
    tag = models.ForeignKey(verbose_name="关联标签", to="CategoryTag", on_delete=models.CASCADE, null=True)

    #  定义数据库元信息
    class Meta:
        # 数据库表名
        db_table = "article_to_tag"
        # admin后台显示的表名称
        verbose_name = "文章关联标签"
        verbose_name_plural = verbose_name


# 点赞点踩表
class UpAndDown(BaseModel):
    # 关联用户对象
    # 多对一关系：一篇文章可以对应多个用户，一个用户可以对多篇文章进行点赞点踩
    user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
    # 关联文章对象
    article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
    # 点赞点踩状态
    up_or_down = models.BooleanField(verbose_name="是否点赞点踩")

    # create_time
    # update_time

    #  定义数据库元信息
    class Meta:
        #  数据库表名
        db_table = "up_and_down"
        #  admin后台显示的表名称
        verbose_name = "点赞点踩表"
        verbose_name_plural = verbose_name


# 评论表
class Comment(BaseModel):
    # 关联用户对象
    # 多对一关系：一篇文章可以对应多个用户，一个用户可以对多篇文章进行评论
    user = models.ForeignKey(verbose_name="关联用户", to='user.UserInfo', on_delete=models.CASCADE)
    # 关联文章对象
    # 多对一关系：一篇文章可以对应多个评论，一个评论只能对应一篇文章
    article = models.ForeignKey(verbose_name="关联文章", to='Article', on_delete=models.CASCADE)
    # 评论内容
    content = models.CharField(verbose_name="评论内容", max_length=255)
    # 评论的父评论 , 有些评论就是根评论
    parent = models.ForeignKey(verbose_name="自关联主评论", to="self", on_delete=models.CASCADE, null=True)
    is_deleted = models.BooleanField(verbose_name="是否删除评论，假删除", default=False)

    # create_time
    # update_time

    #   定义数据库元信息
    class Meta:
        # 数据库表名
        db_table = "comment"
        # admin后台显示的表名称
        verbose_name = "用户评论表"
        verbose_name_plural = verbose_name
